package net.tv90.bfmccore.util.vector;

import org.bukkit.Location;
import org.bukkit.World;

import java.io.Serializable;

/**
 * 三维整形向量 注意：笛卡尔坐标系与MC中的坐标系方向不同！(y轴与z轴是反的)
 */

public class Vector3i implements Serializable {

    public int x, y, z;

    public Vector3i() {
        set(0, 0, 0);
    }

    public Vector3i(int x, int y, int z) {
        set(x, y, z);
    }

    public void set(int x, int y, int z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    /**
     * 获取长度
     *
     * @return 长度
     */
    public int lengthSquared() {
        return x * x + y * y + z * z;
    }

    /**
     * 平移向量
     *
     * @param x x平移量
     * @param y y平移量
     * @return this
     */
    public Vector3i translate(int x, int y, int z) {
        this.x += x;
        this.y += y;
        this.z += z;
        return this;
    }

    /**
     * 转换为MC中的坐标 注意：笛卡尔坐标系与MC中的坐标系方向不同！(y轴与z轴是反的)
     *
     * @param world 世界名
     * @return 坐标
     */
    public Location toLocation(World world) {
        return new Location(world, this.x, this.y, this.z);
    }

    /**
     * 降维成二维向量 注意：笛卡尔坐标系与MC中的坐标系方向不同！(y轴与z轴是反的)
     *
     * @return 降维后的向量
     */
    public Vector2i reduction() {
        return new Vector2i(this.x, this.z);
    }

    @Override
    public String toString() {
        return "Vector3i[" + x + ", " + y + "," + z + ']';
    }

    public int getX() {
        return this.x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return this.y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getZ() {
        return this.z;
    }

    public void setZ(int z) {
        this.z = z;
    }

}